package cn.coin.ox.common.erc20.service;


import cn.coin.ox.common.erc20.enums.ERC20ContractAddressEnums;
import cn.coin.ox.common.erc20.enums.EndpointsEnums;
import cn.coin.ox.common.erc20.model.UserWallet;
import org.springframework.util.StringUtils;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.ECKeyPair;
import org.web3j.crypto.WalletFile;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.methods.response.TransactionReceipt;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Map;

/**
 * 用户资产账户业务操作
 * @date 2020/5/23 16:38
 */
public interface ERC20Service {

    /**
     * 生成助记词
     * @return
     */
    String generateMnemonics();

    /**
     * 创建钱包 流程：
     *    * 1、随机生成一组助记词
     *    * 2、生成 一个种子seed
     *    * 3、根据seed生成公钥、私钥、地址
     *    * 4、根据公钥、 私钥、 密码生成钱包文件，也就是Keystore
     * @param password 密码
     * @param walletFileBasePath 钱包json保存的文件夹
     * @param mnemonics 助记词（可空）
     * @return 钱包JSON文件储存位置
     */
    String createWallet(String password, String walletFileBasePath, String mnemonics);

    /**
     * 获取web3j证书对象
     * @param walleFilePath
     * @param passWord
     * @return
     */
    Credentials getCredentials(String walleFilePath, String passWord);

    /**
     * 导出账户信息
     * @param credentials
     * @return
     */
    UserWallet loadWallet(Credentials credentials);

    /**
     * 连接以太坊客户端
     * @param endpoints  chainId环境节点
     *  mainnet:主要的以太坊网络, ropsten:测试网, kovan:, rinkeby:, goerli:
     * @return
     */
    Web3j createEthClient(EndpointsEnums endpoints) throws Exception;

    /**
     * 查询指定地址的余额(ETH余额)
     * @param web3j
     * @param address
     * @return
     * @throws IOException
     */
    BigDecimal getBlanceOf(Web3j web3j, String address) throws IOException;

    /**
     * 获取ERC20合约代币余额
     * @param web3j web3j客户端
     * @param address 要查询的钱包地址
     * @param contract 代币信息
     * @return
     */
    BigDecimal getErc20BalanceOf(Web3j web3j, String address, ERC20ContractAddressEnums contract) throws Exception;


    /**
     * ETH 转账交易
     * @param endpoints 代币网络环境，mainnet:主要的以太坊网络
     * @param credentials web3j证书对象
     * @param addressTo 转账到的指定地址
     * @param amount 金额， 交易金额：1  = 1 ETH
     * @return
     * @throws Exception
     */
    TransactionReceipt ethTransTo(EndpointsEnums endpoints, Credentials credentials, String addressTo, BigDecimal amount) throws Exception;


    /**
     * ERC20 代币转账
     * @param endpoints 代币网络环境，mainnet:主要的以太坊网络
     * @param credentials web3j证书对象
     * @param addressTo 转账到的指定地址
     * @param amount 金额， 交易金额：1 = 1
     * @param contract  代币信息
     * @return
     * @throws Exception
     */
    TransactionReceipt erc20TransTo(EndpointsEnums endpoints, Credentials credentials, String addressTo,
                                    BigDecimal amount, ERC20ContractAddressEnums contract) throws Exception;
}
